// 假设从链表头节点到入环点的距离是D，从入环点到两个指针首次相遇点的距离是S1，从首次相遇点回到入环点的距离是S2。
// 那么，当两个指针首次相遇时，各自所走的距离是多少呢？
// 指针p1一次只走1步，所走的距离是D+S1。
// 指针p2一次走2步，多走了n（n＞=1）整圈，所走的距离是D+S1+n（S1+S2）。

//由于p2的速度是p1的2倍，所以所走距离也是p1的2倍，因此：
//  2(D+S1)=D+S1+n(S1+S2)

//等式经过整理得出：
//  D=(n-1)(S1+S2)+S2”

//也就是说，从链表头结点到入环点的距离，等于从首次相遇点绕环n-1圈再回到入环点的距离。
//这样一来，只要把其中一个指针放回到头节点位置，另一个指针保持在首次相遇点，两个指针都是每次向前走1步。那么，它们最终相遇的节点，就是入环节点。”


//当两个指针首次相遇，证明链表有环的时候，让两个指针从相遇点继续循环前进，并统计前进的循环次数，直到两个指针第2次相遇。此时，统计出来的前进次数就是环长。”
//因为指针p1每次走1步，指针p2每次走2步，两者的速度差是1步。当两个指针再次相遇时，p2比p1多走了整整1圈。
//因此，环长=每一次速度差×前进次数=前进次数。”


function isCycle(head){
    let p1 = head;
    let p2 = head;
    let meatCount=0;
    while(p2!=null && p2.next!=null&& meatCount<1){
        p1=p1.next;
        p2=p2.next.next;
        if(p1 == p2){
            meatCount++;
        }
    }
    // 相遇了 ，把一个指针放到 头结点，继续追击  再次相遇的点就是 环的 入环点
    if( meatCount===1){
        p1=head;
        while(p2!=null && p2.next!=null){
            p1=p1.next;
            p2=p2.next;
            if(p1 == p2){
                return p1
            }
        }
    }
}

class Node{
    constructor(data){
        this.data=data;
        this.next=null;
    }
}


let node1 = new Node(5);
let node2 = new Node(3);
let node3 = new Node(7);
let node4 = new Node(2);
let node5 = new Node(6);

node1.next=node2;
node2.next=node3;
node3.next=node4;
node4.next=node5;
node5.next=node2;



console.log(isCycle(node1));

